import "reflect-metadata";

// 模块的元数据（传入装饰器的参数，如： 模块依赖的控制器）
interface ModuleMetadata {
  // 模块接受一个控制器数组（类数组 - 函数数组）
  controllers: Function[];
}

// 类装饰器
export function Module(metadata: ModuleMetadata): ClassDecorator {
  // metadata 就是在使用 Module 装饰器时传入的参数
  console.log(
    "Module 模块装饰器(类装饰器) 传入装饰器的参数（控制器等）： ",
    metadata
  );
  return function (target: Function) {
    console.log("Module 模块装饰器(类装饰器) 装饰的对象 => ", target, "\n");
    // 设置元数据
    // 给模块装饰的对象 target 身上添加了一个元数据，元数据的属性名是 controllers，值是 metadata.controllers-控制器数组： [controller - 是类不是实例也不是原型]
    Reflect.defineMetadata("controllers", metadata.controllers, target);
  };
}
